#ifndef _QUEUE_DATA_H_
#define _QUEUE_DATA_H_

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef QUEUE_DEBUG
    #define FRAME_QUEUE_SIZE 10    // 队列的最大帧数
    #define YUV422_FRAME_SIZE (640*512*2) // 假设每帧YUV422大小为640x480，YUV422每像素占2字节

    typedef unsigned char uint8_t;
    typedef struct FrameNode {
        uint8_t* frame_data;
    } FrameNode;

    typedef struct {
        FrameNode frames[FRAME_QUEUE_SIZE];   // 存放帧的数组
        int head;
        int tail;
        int count;           // 队列中的帧数
        pthread_mutex_t mutex;  // 互斥锁
        pthread_cond_t not_full;  // 队列未满的条件变量
        pthread_cond_t not_empty; // 队列非空的条件变量
    } FrameQueue;

    void init_queue();
    void destroy_queue();
    int WriteQueue( void* frame_data, int size);
    int getQueue( void* frame_data);
    int getQueueLen();
#elif ( 2 > 3)
    #define FILE_SIZE 640 * 1024    // 文件大小 640KB
    #define QUEUE_SIZE (1024 * 640 * 5)  // 队列大小设置为1280kb

    typedef struct {
        char *buffer;       // 存储数据的缓冲区
        int head;           // 头索引
        int tail;           // 尾索引
        int size;           // 缓冲区的总大小
        pthread_mutex_t mutex;       // 互斥锁保护队列
        pthread_cond_t not_full;     // 条件变量：队列未满
        pthread_cond_t not_empty;    // 条件变量：队列非空
    } CircularQueue;

    // void    initQueue(CircularQueue *q, int size);
    // int     isFull(CircularQueue *q) ;
    // int     isEmpty(CircularQueue *q) ;
    // int     enqueue(CircularQueue *q, char *data, int len);
    // int     dequeue(CircularQueue *q, char *data, int len);
    // void    destroyQueue(CircularQueue *q) ;

    void    initQueue(CircularQueue *q, int size);
    int     isFull() ;
    int     isEmpty() ;
    int     enqueue(char *data, int len);
    int     dequeue(char *data, int len);
    void    destroyQueue() ;
#else
    #define QUEUE_SIZE (1024 * 1024)  // 环形队列总大小 1MB
    #define MAX_DATA_SIZE (320 * 1024) // 单次数据最大300KB

    typedef struct {
        char buffer[QUEUE_SIZE];   // 环形队列内存池
        size_t head;               // 队列头指针
        size_t tail;               // 队列尾指针
        size_t size;              // 队列中数据的字节数
        pthread_mutex_t mutex;      // 互斥锁
        pthread_cond_t not_empty;  // 队列非空条件变量
        pthread_cond_t not_full;   // 队列非满条件变量
    } CircularQueue;

    void init_queue(CircularQueue *q);
    void enqueue(void* data, size_t data_size);
    void* dequeue(size_t* data_size);

#endif
#endif